package br.ufes.ceunes.poo.model.DAO;


import br.ufes.ceunes.poo.model.pojo.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import javax.swing.JOptionPane;


public class ItemDAO {
	
    static String arquivo = "item.txt";
    private int idItem = 0;
    private ArrayList<Item> itens = null;
    private static ItemDAO instancia = null;

    /**
     *
     */
    public ItemDAO(){
        this.itens = new ArrayList<>();
    }
    public static synchronized ItemDAO getIntancia(){
        if(instancia == null){
            instancia = new ItemDAO();
        }
        return instancia;
    }

    /**
     *
     * @param id
     * @return
     */
    public Fornecedor pos(int id){
            int i;
            for(i=0;i<FornecedorDAO.getInstancia().getFornecedores().size();i++)
            {
                    if(id==FornecedorDAO.getInstancia().getFornecedores().get(i).getIdFornecedor())
                            return FornecedorDAO.getInstancia().getFornecedores().get(i);
            }
            return null;
    }
    public void adicionarItensArquivo(String margemDelucro,String precoDeCusto,String nome,String quant,String id,int[] idfor,int q){
            Item i = new Item();
            i.setNome(nome);
            i.setQuantidade(Integer.parseInt(quant));
            i.setIdItem(Integer.parseInt(id));
            i.setMargemDeLucro(Float.parseFloat(margemDelucro));
            i.setPrecoDeCusto(Float.parseFloat(precoDeCusto));
            int j;
            for(j=0;j<q;j++){
                    i.setFornecedores(pos(idfor[j]));
            }
            this.itens.add(i);

    }

    /**
     *
     */
    public void lerArquivo()
    {
        int i,j,qt,cont;
        String nome,id;
        Scanner sc;
        try{  
        sc = new Scanner(new FileReader(new File(arquivo))); 
        while(sc.hasNext()){
            String valor = sc.nextLine();
            this.idItem=Integer.parseInt(valor);
            String margemDeLucro,precoDeCusto,quant;
            valor = sc.nextLine();
            qt = Integer.parseInt(valor);
            for(i=0;i<qt;i++){
                    margemDeLucro = sc.nextLine();
                    precoDeCusto = sc.nextLine();
                    nome = sc.nextLine();
                    quant = sc.nextLine();
                    id = sc.nextLine();
                    j = Integer.parseInt(sc.nextLine());
                    int[] idfor = new int[j];
                    for(cont=0;cont<j;cont++){
                            idfor[cont] = Integer.parseInt(sc.nextLine());
                    }
                    adicionarItensArquivo(margemDeLucro,precoDeCusto,nome,quant,id,idfor,j);
            }
        }
    }catch (FileNotFoundException e){ 
            try {  
                 File file = new File("arquivo");  
                 boolean success = file.createNewFile();  
                 if (success) {  
                 } else {  
                 }  
             } catch (IOException ee) {  
        JOptionPane.showMessageDialog(null, "Erro ao Criar "+arquivo);
        }
    } 
}
    public void gravarArquivoItem()
    {
        int i,j;
        try{
            File arquivu = new File(arquivo);
            try (FileOutputStream fos = new FileOutputStream(arquivu)) {
                String texto;
                texto = this.idItem+"\r\n";
                fos.write(texto.getBytes());
                texto = this.itens.size()+"\r\n";
                fos.write(texto.getBytes());
                for(i = 0;i<this.itens.size();i++)
                {
                    texto = Float.toString(this.itens.get(i).getMargemDeLucro())+"\r\n";
                    fos.write(texto.getBytes());
                    texto = Float.toString(this.itens.get(i).getPrecoDeCusto())+"\r\n";
                    fos.write(texto.getBytes());
                    texto = this.itens.get(i).getNome()+"\r\n";
                    fos.write(texto.getBytes());
                    texto = this.itens.get(i).getQuantidade()+"\r\n";
                    fos.write(texto.getBytes());
                    texto = this.itens.get(i).getIdItem()+"\r\n";
                    fos.write(texto.getBytes());
                    texto = this.itens.get(i).fornecedores.size()+"\r\n";
                    fos.write(texto.getBytes());
                    for(j=0;j<this.itens.get(i).fornecedores.size();j++)
                    {
                        texto = this.itens.get(i).fornecedores.get(j).getIdFornecedor()+"\r\n";
                        fos.write(texto.getBytes());
                    }
                }
            }
        }catch (IOException ee){ 
            System.out.println("Erro ao salvar arquivo em "+arquivo);
        }

    }

    public void cadastroItem(Item it)
    {
        this.idItem++;
        it.setIdItem(this.idItem);
        it.setMargemDeLucro((calcularLucro(it.getPrecoDeCusto(), (float) 1.6)));
        this.itens.add(it);
    }
    public int verExiste(String nome){
            int i;
            for(i=0;i<this.itens.size();i++)
            {
                    if(nome.equals(this.itens.get(i).getNome()))return 1;
            }
            return 0;
    }
    public Item acharItemNome(String nome){
            int i;
            for(i=0;i<this.itens.size();i++)
            {
                    if(nome.equals(this.itens.get(i).getNome()))return this.itens.get(i);
            }
            return null;
    }
    public Item acharItemId(int cod) {
            int meio, inicio, fim;
            inicio = 0;
            fim = this.itens.size();
            System.out.println(this.itens.size());
            while(inicio <= fim){
                    meio = (inicio + fim)/2;
                    if(this.itens.get(meio).getIdItem() == cod){
                            return this.itens.get(meio);
                    }
                    else if(cod > this.itens.get(meio).getIdItem()){
                            inicio = meio;
                    }
                    else{
                            fim = meio;
                    }
            }
            return null;
    }
    public int verEstoque(int quant,Item it)
    {
            if(quant<=it.getQuantidade())return 1;
            else
                    return 0;
    }
    public float mediaPrecoDeCusto(Item item, double margem, int quantidade){
            float novoPreco,itemPrecoDeCusto; 
            int quant;
            quant = item.getQuantidade();
            itemPrecoDeCusto = item.getPrecoDeCusto();
            novoPreco = (float) ((margem*quantidade + itemPrecoDeCusto*quant)/(quant+quantidade));
            return novoPreco;
    }
    public float calcularLucro(float precoCusto, float porcetagem){
            return (precoCusto * porcetagem);
    }
    
    public ArrayList<Item> getItem()
    {
        return this.itens;
    }
}
